package com.my.screenadapter.myHandler;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.my.screenadapter.Base.BaseActivity;
import com.my.screenadapter.R;

import java.lang.ref.WeakReference;

import butterknife.BindView;

/**
 * Created by ${张英杰} on 2017/10/13.
 */

public class HandlerDemoActivity extends BaseActivity {
    private static final String TAG = "HandlerDemoActivity===";
    @BindView(R.id.textView)
    public TextView textView;
    @BindView(R.id.button)
    Button button;
    MyHandler myHandler = new MyHandler(this);
    Handler mhandlerTwo = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.i(TAG, "handleMessage: two ----");
        }
    };

    @Override
    protected void init() {
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                new Thread(new Runnable() {
//                    @Override
//                    public void run() {
//
//                    }
//                }).start();
                Message obtain = Message.obtain();
                myHandler.sendMessageDelayed(obtain, 1000);
                finish();
            }
        });
        findViewById(R.id.btn_send_empty)
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mhandlerTwo.sendEmptyMessage(0);
                    }
                });
        findViewById(R.id.btn_send_muti)
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        myHandler.sendEmptyMessage(0);
                    }
                });
    }

    @Override
    protected int initLayoutId() {
        return R.layout.activity_handler2;
    }

    private static class MyHandler extends BaseHandler {
        private Context mContext;

        public MyHandler(Context context) {
            super(context);
            mContext = context;
        }

        @Override
        public void myHandleMessage(Message msg) {
            Log.i(TAG, "handleMessage: ====");
            ((HandlerDemoActivity) mContext).textView.setText("abcd");
        }
    }

    WeakStaticHandler mWeakHandler = new WeakStaticHandler(this) {
        @Override
        public void baseHandleMessage(Message msg, HandlerDemoActivity obj) {

        }
    };

    /**
     * Handler持有MemoryLeakActivity引用，为什么？
     * 如果不持有当前类的引用，我怎么更改当前类的ui或其他逻辑？？？
     * 或者我们知道内部类持有外部类引用也行。那么怎么解决那？
     * <p>
     * 解决办法：将内部类改为静态内部类，因为静态内部类不持有外部类引用。
     * 由于Handler不再持有外部类引用，导致程序不允许你在Handler中操作Activity中的对象了。
     * 所以你还需要在Handler中增加一个对Activity的弱引用(使用弱引用的好处在于:activity一旦被置为null，他就会被立刻回收)。
     * 上面持有的引用属于强引用，强引用的特点就是当当前类被回收的时候，如果它被强引用所持有，那么当前类是不会被回收的！！！所以我们改成软引用持有当前类对象，这样在GC回收时会忽略掉弱引用，即就算有弱引用指向某对象，该对象也会在被GC检查到时回收掉。
     * <p>
     * 静态内部抽象类
     * 单独抽取出来这种类型的内部类。
     * 既然该内部类 是外部类的一个成员， 成员能用的修饰符，在内部类上，当然也可以使用了
     */
    abstract static class WeakStaticHandler extends WeakHandler<HandlerDemoActivity> {

        public WeakStaticHandler(HandlerDemoActivity reference) {
            super(reference);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        myHandler.removeCallbacksAndMessages(null);
        mhandlerTwo.removeCallbacksAndMessages(null);
        mWeakHandler.removeCallbacksAndMessages(null);
    }

    Handler mhandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            return true;
        }
    });

    Handler mhandlerReference = new Handler((Handler.Callback) new WeakReference<Handler.Callback>(new Handler.Callback(){
        @Override
        public boolean handleMessage(Message msg) {
            return true;
        }
    }));

    private void testRunable(){

//        mhandler.post()
    }

}
